ParentDataWidget のジェネリック タイプが ParentData に変更されました
まとめ
のジェネリックタイプParentDataWidget
から変わりましたRenderObjectWidget
にParentData
。
コンテクスト
この変更の前は、ParentDataWidget
縛られていた
特定のRenderObjectWidget
祖先としてタイプします。
たとえば、Positioned
ウィジェットのみ使用可能
以内Stack
ウィジェット。この変更により、
あるParentDataWidget
どれでも使用できますRenderObjectWidget
祖先として入力する
のRenderObject
言ったRenderObjectWidget
正しい設定をするParentData
タイプ。この新しい世界で、
のPositioned
ウィジェットは仮説で再利用できます
新しいSuperStack
ウィジェット。
変更内容の説明
のジェネリック型引数ParentDataWidget
から変わりましたRenderObjectWidget
にParentData
、
そして新しいデバッグプロパティ、debugTypicalAncestorWidgetClass
、
に追加されますParentDataWidget
。
後者は、ユーザーに情報を提供するエラー メッセージに使用されます。
与えられたコンテキストのより良いアイデアParentDataWidget
で使用されることになっています。
移行ガイド
このセクションの説明に従ってコードを移行する必要があります
サブクラス化または実装している場合ParentDataWidget
。
これを行うと、アナライザーは次の警告を表示します。
この変更を含む Flutter バージョンにアップグレードします。
error • Missing concrete implementation of 'getter ParentDataWidget.debugTypicalAncestorWidgetClass' • lib/main.dart:114:7 • non_abstract_class_inherits_abstract_member
error • 'FrogJar' doesn't extend 'ParentData' • lib/main.dart:114:41 • type_argument_not_matching_bounds
移行前のコード:
class FrogSize extends ParentDataWidget<FrogJar> {
FrogSize({
Key key,
required this.size,
required Widget child,
}) : assert(child != null),
assert(size != null),
super(key: key, child: child);
final Size size;
@override
void applyParentData(RenderObject renderObject) {
final FrogJarParentData parentData = renderObject.parentData;
if (parentData.size != size) {
parentData.size = size;
final RenderFrogJar targetParent = renderObject.parent;
targetParent.markNeedsLayout();
}
}
}
class FrogJarParentData extends ParentData {
Size size;
}
class FrogJar extends RenderObjectWidget {
// ...
}
移行後のコード:
class FrogSize extends ParentDataWidget<FrogJarParentData> { // FrogJar changed to FrogJarParentData
FrogSize({
Key key,
required this.size,
required Widget child,
}) : assert(child != null),
assert(size != null),
super(key: key, child: child);
final Size size;
@override
void applyParentData(RenderObject renderObject) {
final FrogJarParentData parentData = renderObject.parentData;
if (parentData.size != size) {
parentData.size = size;
final RenderFrogJar targetParent = renderObject.parent;
targetParent.markNeedsLayout();
}
}
@override
Type get debugTypicalAncestorWidgetClass => FrogJar; // Newly added
}
のジェネリックタイプParentDataWidget
スーパークラス
からの変更FrogJar
(RenderObjectWidget
) にFrogJarParentData
(ParentData
それをタイプしますFrogSize.applyParentData
を操作したいと考えています)。
さらに、新しいdebugTypicalAncestorWidgetClass
このために実装されているParentDataWidget
サブクラス。
典型的な祖先のタイプを返します。RenderObjectWidget
このためParentDataWidget
。ほとんどの時間、
ここでは古いジェネリック型を返したいだけです
(FrogJar
この例では)。
タイムライン
リリースされたバージョン: 1.16.3
安定版リリース: 1.17
参考文献
API ドキュメント:
ParentDataWidget
関連する PR:
- ParentDataWidget をさまざまな祖先 RenderObjectWidget タイプで使用できるようにする